T first<T>(List<T> ts) {
  // 处理一些初始化工作或错误检测……
  T tmp = ts[0];
  // 处理一些额外的检查……
  return tmp;
}

class Fruit {
  final String color;

  Fruit(this.color);
}

class Apple extends Fruit {
  Apple() : super("red");
}

class Orange extends Fruit {
  Orange() : super("orange");
}

void printColors(List<Fruit> fruits) {
  for (var fruit in fruits) {
    print('${fruit.color}');
  }
}

void main() {
  List<Apple> apples = <Apple>[];
  apples.add(Apple());
  printColors(apples); //Apple是Fruit的子类型，所以List<Apple>是List<Fruit>子类型。
  // 所以printColors函数接收一个List<Fruit>类型，可以使用List<Apple>类型替代
  List<Orange> oranges = <Orange>[];
  oranges.add(Orange());
  printColors(oranges); //同理

  List<Fruit> fruits = <Fruit>[];
  fruits.add(Fruit('purple'));
  printColors(fruits); //Frui

  // num a = first<num>([3, 4]);
}
